import { hussarRequest } from 'hussar-base';
import * as ThemeBase from 'ThemeBase';
import Vue from 'vue';
import Vuex from 'vuex';
import * as Lodash from 'lodash';
import store from '@/pages/index/store';

// 导入依赖
const depMap = {
  ThemeBase,
  vue: Vue,
  vuex: Vuex,
  lodash: Lodash
};

// js文件解析
export function parseUmdModule(jsText) {
  return new Promise((resolve, reject) => {
    const root = window;
    // 在 window 上添加 define ⽅法，伪装层amd规范
    root.define = function (...args) {
      let func = null;
      let depArr = [];
      if (args.length > 1) {
        depArr = args[0];
        func = args[1];
      } else {
        func = args[0];
      }
      const deps = depArr.map(depName => {
        // eslint-disable-next-line no-undef
        return depMap[depName];
      });
      // 在 define的回调函数中注⼊依赖，否则会报错
      const result = func(...deps);
      // 拿到 vue definition object 移除伪装
      root.define = undefined;
      if (result) {
        // 返回 解析的 vue object
        resolve(result);
      } else {
        // eslint-disable-next-line prefer-promise-reject-errors
        reject('解析组件错误');
      }
    };
    root.define.amd = true; // 伪装成 amd 的 define。
    // 解析umd格式的⽂本, 由于UMD是闭包⾃执⾏函数，这⾥不会报错
    // eslint-disable-next-line no-new-func
    const scope = new Function(jsText);
    scope();
  });
}

// 获取导入基础组件库资源
export function baseComponentImport() {
  return new Promise((resolve) => {
    hussarRequest.post('/component/getAllFrontFile').then((res) => {
      if (res.code === 10000) {
        res.data.forEach((str) => {
          parseUmdModule(str).then(jsModule => {
            Vue.use(jsModule.default);
            store.commit('addBaseComponents', jsModule);
          });
        });
      }
    });
  });
}
